#pragma once
#include "common.hpp"
const int defaultfd = -1;
class NamedPipe
{
public:
    NamedPipe(const std::string &name) : _name(name), _fd(defaultfd)
    {
    }
    bool Create()
    {
        // 先创建一个管道
        int n = mkfifo(fifoname.c_str(), mode);
        if (n == 0)
        {
            std::cout << "mkfifo success" << std::endl;
        }
        else
        {
            perror("mkfifo");
            return false;
        }
        return true;
    }
    void Close()
    {
        if (_fd == defaultfd)
        {
            return;
        }
        else
        {
            close(_fd);
        }
    }
    bool OpenForRead()
    {
        _fd = open(fifoname.c_str(), O_RDONLY);
        if (_fd < 0)
        {
            perror("open");
            return false;
        }
        std::cout << "open file success" << std::endl;
        return true;
    }
    bool OpenForWrite()
    {
        _fd = open(fifoname.c_str(), O_WRONLY);
        if (_fd < 0)
        {
            perror("open");
            return false;
        }
        return true;
    }
    // 输入参数：const &
    // 输出参数：*
    // 输入输出参数：&
    bool Read(std::string *out)
    {
        char buffer[SIZE] = {0};                             // 根据以下的实验可以得知，这样相当于设置字符串的结尾
        ssize_t num = read(_fd, buffer, sizeof(buffer) - 1); // 这里为什么要减一，因为要减去字符串的百分号0
        if (num > 0)
        {
            buffer[num] = 0; //
            *out = buffer;
        }
        else if (num == 0)
        {
            return false;
        }
        else
        {
            return false;
        }
        return true;
    }
    void Write(const std::string &in)
    {
        write(_fd, in.c_str(), in.size());
    }

private:
    std::string _name;
    int _fd;
};
// 关于 \0 和'0' 的区别 第一个在ASII码里面对应的是 0 而另一个对应的是48
// 假设我有这么一段代码 那么它的输出结果为 空格 0 0
//  #include <stdio.h>
//  #include <iostream>
//  using namespace std;
//  int main()
//  {
//  	char str = 0;
//  	char str2 = '0';
//  	char str3 = 48;
//  	cout << str << endl;
//  	cout << str2<< endl;
//  	cout << str3<< endl;
//  	return 0;
//  }

// getline 的用法  std::istream& getline(std::istream& is, std::string& str, char delim);
// 其中，is 是输入流对象，str 是存储读取数据的字符串，delim 是指定的行分隔符（默认为换行符 \n）。
// std::getline() 函数从输入流中读取字符，直到遇到指定的分隔符（默认为换行符）或者到达文件结尾。它将读取的字符存储到 str 字符串中，并丢弃分隔符。
//  string str ;
//  getline(cin,str,':');
//  cout << str << endl;   比如输入123 4 \0 : 输出结果->123 4 \0
